package com.bjsxt.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestMap {

    public static void main(String[] args) {

        //HashMap的装填因子默认为0.75，初始容量为16
        //容量必须是2的指数次方

        //JDK 1.7
        //底层原理：哈希表
        //      1.先计算key的哈希值
        //      2.根据哈希值计算key的索引位置
        //      3.如果位置上没有元素，则直接放入，如果位置上有元素，
        //则比较key是否相同，如果相同，则覆盖，如果不相同，则放入（链表的第一个位置）

        //JDK 1.8
        //底层原理：数组+链表+红黑树
        //      1.先计算key的哈希值
        //      2.根据哈希值计算key的索引位置
        //      3.如果位置上没有元素，则直接放入，如果位置上有元素，
        //则比较key是否相同，如果相同，则覆盖，如果不相同，则放入（链表的末尾）
        //      4.如果链表长度大于8，且当前容量大于64，则将链表转换为红黑树
        Map<String, String> map = new HashMap<>();

        //key：唯一
        //value：可以重复
        //HashMap：无序
        map.put("001", "张三");
        map.put("002", "李四");
        map.put("003", "王五");
        map.put("004", "赵六");
        map.put("001", "张三三");
        map.put("005", "钱七");
        map.put("006", "钱七");
        map.put(null, null);

        System.out.println(map.size());
        System.out.println(map);
        System.out.println(map.get("005"));

        System.out.println("--------------------------------");

        System.out.println(map.keySet());       //Set
        System.out.println(map.values());       //Collection

        //遍历1：先得到key，再通过key得到value（不推荐）
        Set<String> keySet = map.keySet();

        for (String key : keySet) {
            System.out.println(key + "：" + map.get(key));
        }
        System.out.println("--------------------------------");

        Iterator<String> it = keySet.iterator();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key + "：" + map.get(key));
        }
        System.out.println("--------------------------------");

        //遍历2：先得到所有的key-value组成的Set集合，再遍历Set集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();

        for (Map.Entry<String, String> entry : entrySet) {
            //System.out.println(entry);
            System.out.println(entry.getKey() + "：" + entry.getValue());
        }
        System.out.println("--------------------------------");

        Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();
        while (it2.hasNext()) {
            Map.Entry<String, String> entry = it2.next();
            System.out.println(entry.getKey() + "：" + entry.getValue());
        }




    }
}
